#include <stdio.h>

// 全局变量
int g; // 不被任何函数所包含

char *f()
{
    // char c[100]; // 局部变量，在栈中分配
    char *c = malloc(100);
    ...
    ...
    ...
    return c; // 一旦函数退出，所有的栈变量马上被释放
}

// 1. 静态数据：全局变量
int g = 123;
int k; // 未初始化的静态变量，会被自动初始化为0
int a[10000]; // 为了节省磁盘空间，此处不会在程序文件中出现10000个元素，只会做个简单的标记，注明a有10000个未初始化的元素
int b[10000] = {1,2,3,4,5......};


int main(int argc, char const *argv[])
{
    // 2. 静态数据：static局部变量
    static int w;

    // 栈内存：后进先出
    // 对应变量：局部变量(也称为临时变量)
    // 1，函数调用时被分配、函数退出时被释放
    // 2. 大小有限，不能定义大变量
    int n;
    int b[3];
    char *p;
    double f;


    // 堆内存（也称为自由内存）
    // 1. 自定义分配、自定义释放
    // 2. 大小仅受物理内存的限制
    int *p  = malloc(100);   // 不会自动清零
    char *k = calloc(5, 20); // 自动清零这些字节
    free(p);  // 将p指向的堆内存归还给系统（退房）
    free(k);


    return 0;
}
